/* 
   交叉类型： & 
        功能类似于接口继承（extends），用于组合多个类型为一个类型
        （常用于对象类型）
    习惯用 extends 就用继承，习惯用 & 就用交叉类型，用哪个都可以。
*/

interface Person1 {
    name: string
}

interface Contact {
    phone: string
}

// type 是类型别名
//  type myArray = (number | string)[]
//  let a1: myArray = [1, 2, "a", "b"];
type PersonDetail = Person1 & Contact;
let per: PersonDetail = {
    name: "alice",
    phone: "134567896636"
}

// ******************************************

/* 
    交叉类型和接口：
        相同点：都可以实现对象类型的组合；
        不同点：对于同名属性之间处理冲突的方式不同
            - 接口继承直接报错
            - 交叉类型组合成 A|B 的关系
*/
interface AA {
    fn: (value: number) => string
}
// interface BB extends AA {//error:类型不兼容
//     fn:(value:string)=>string
// }

interface BB {
    fn: (value: string) => string
}

type CC = AA & BB;
let cc: CC;
cc.fn();
// 46 行和下面的等价
let ccc: CC = {
    fn(value: number | string) {
        return '';
    }
}

